/* =============================================================================
PROJET           : c-social-network
NOM DU FICHIER   : tableau.h
OBJET            : Header du module personne.
--------------------------------------------------------------------------------
DATE DE CREATION : 30/04/10
AUTEUR           : Benjamin MICHEL
--------------------------------------------------------------------------------
MODIFICATIONS (   n) date - auteur - description )
    1) 27/04/10 - Benjamin MICHEL -
============================================================================= */

/*Usage de NULL*/
#include <stddef.h>

/*Usage de Malloc*/
#include <stdlib.h>

/*Usage de assert*/
#include <assert.h>

/*Importation du header*/
#include "graph.h"

/*===Declaration fonctions privées===*/

/*
procedure destroy_entry(IN OUT: t_graph * graph);
détruit l'élément positionné au niveau du curseur

--ensure:
--  l'élément au curseur-1 est vide
*/
void destroy_entry(t_graph *);

/*
procedure parcours_graph(IN OUT: t_graph * graph);
incrémente le curseur de 1 si la fin n'est pas atteinte
sinon retours à 0

--ensure:
--  graph->curseur € [ 0 - graph->taille ]
*/
void parcours_graph(t_graph *);


t_graph* creer(int taille){
    /*déclaration graph*/
    t_graph *graph;

    /*Allocation d'espace pour le graph*/
    graph = ( t_graph * ) malloc( sizeof(t_graph) );

    /*initialisation de la taille*/
    graph->taille = taille;

    /*positionne le curseur à 0*/
    graph->curseur = 0;

    /*initialisation du tableau de personnes*/
    graph->tabl_pers = ( t_tabl_pers *) malloc( sizeof(t_tabl_pers) *  taille );

    return graph;

}


int is_vide(const t_graph *graph){
    return (graph == NULL);
}


void insert_pers(t_personne *pers, t_graph *graph){
	/*parcours le graph*/
	parcours_graph(graph);

    /*le curseur est obligatoirement supérieur ou égale à 0*/
    assert(graph->curseur >= 0);
    /*le curseur doit être inférieur à la taille*/
    assert(graph->curseur < graph->taille);

	/*copie le pointeur du graph*/
	graph->tabl_pers[graph->curseur].pers = pers;
}


t_personne *get_next_pers(t_graph *graph){
    parcours_graph(graph);

    /*le curseur est obligatoirement supérieur ou égale à 0*/
    assert(graph->curseur >= 0);
    /*le curseur doit être inférieur à la taille*/
    assert(graph->curseur < graph->taille);

	return graph->tabl_pers[graph->curseur].pers;
}


int get_taille(const t_graph *graph){
    return graph->taille;
}



int get_curseur(const t_graph *graph){
    return graph->curseur;
}


void destroy(t_graph **graph){
    (*graph)->curseur = 0;/*on met le curseur à 0*/
    /*on détruit les éléments du tableau*/
    while ((*graph)->curseur < ((*graph)->taille - 1) ){
        destroy_entry(*graph);
        parcours_graph;
    }
    /*on libère la mémoire*/
    free((*graph)->tabl_pers);
    free(*graph);
    /*on remet le pointeur à 0*/
    *graph = NULL;
}
/*=========Fonctions privées=========*/
void destroy_entry(t_graph *graph){
    /*pers est un pointeur sur une personne*/
    t_personne *pers = get_next_pers(graph);

    /*on détruit la personne*/
    f_personne.destroy(&pers);
}

void parcours_graph(t_graph *graph){
    if ( graph->curseur == (graph->taille - 1) )
        graph->curseur = 0;
    else
        graph->curseur++;
}

